#include "DefaultSceneGraph.h"

namespace Nezha
{

	void DefaultSceneGraph::_initialize()
	{
		// TODO


	}

	SceneNode* DefaultSceneGraph::createNodeImpl(const _string& name)
	{
		return NZ_New SceneNode(name);
	}

	SceneNode* DefaultSceneGraph::findSceneNode(const _string& name)
	{
		SceneNode* sn = NULL;
		mSceneNodes.search(name, sn);
		return sn;
	}

	void DefaultSceneGraph::destroySceneNode(SceneNode* sn)
	{
		if(!mSceneNodes.search(sn->getName(), sn))
		{
			NZError("Invalid scene node %s, it's not contained in scene graph.");
			return;
		}

		//mSceneNodeGarbages.push_back(sn);

		if(sn->getParentSceneNode())
		{
			sn->getParentSceneNode()->removeChild(sn);
		}

		recuDeleteChild(sn);
	}

	void DefaultSceneGraph::recuDeleteChild(SceneNode* sn)
	{
		u32 num = sn->getNumChildren();
		for(u32 i = 0; i < num; i++)
		{
			SceneNode* ch_sn = sn->getChild(i);
			recuDeleteChild(ch_sn);
		}

		if(mSceneNodes.remove(sn->getName()))
		{
			NZ_ASSERT(false);
		}

		NZ_Delete sn;
	}

	void DefaultSceneGraph::update(float dt)
	{
		// TODO ?
	}

	void DefaultSceneGraph::_insertNode(SceneNode* so)
	{
		mSceneNodes.insert(so->getName(), so);
	}

	void DefaultSceneGraph::_destroyAllObjects()
	{
		SceneNodeNameMap::ExclusiveIterator iter;

		if(mSceneNodes.beginExlusiveIterate(iter))
		{
			SceneNode* sn = iter.val();
			while(sn)
			{
				NZ_Delete sn;

				if(!iter.next())
				{
					break;
				}

				sn = iter.val();
			}
		}

		mSceneNodes.clear();
	}

}//end namespace Nezha